package createModel.singletonMode.lazySingleton;

/**
 * 2023/12/30
 * <p>
 * ZhangYi
 * Description 懒汉式单例模式: 只有在需要的时候才会初始化
 *   必须构造函数私有化，防止外部类实例化
 */
public class LazySingleton {
    private LazySingleton() {

    }

    private static LazySingleton instance;


    /**
     * 功能描述: 如下代码,如果线程A 拿到了资源 ,线程B 又拿到了资源, 同时执行到了 if (instance == null){ 就会初始化两个对象
     *
     * 这个在单线程的情况下, 是绝对可以使用的
     *
     * @return {@link LazySingleton }
     */
    public static LazySingleton getInstance3() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
    /***
     * 加锁:,效率低下,不推荐: 无论有没有 都会加锁
     */
    public static synchronized LazySingleton getInstance1(){
        if (instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }

    /***
     * 双重检测锁机制: 这种方案是最优的,推荐使用,线程安全
     */
    public static LazySingleton getInstance() {
        if (instance == null) {
            synchronized (LazySingleton.class) {
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }

}
